<?php
/**
 * util crypt
 * @package common_lib_util
 */
/**
 * util crypt
 * @author pandajingjing
 * @package common_lib_util
 */
class util_crypt{

	/**
	 * 加密函数
	 * @param string $p_strValue
	 * @param string $p_strKey
	 * @return string
	 */
	public static function encrypt($p_strValue,$p_strKey){
		return self::_code($p_strValue,'ENCODE',$p_strKey);
	}
	
	/**
	 * 解密函数
	 * @param string $p_strValue
	 * @param string $p_strKey
	 * @return string
	 */
	public static function decrypt($p_strValue,$p_strKey){
		return self::_code($p_strValue,'DECODE',$p_strKey);
	}

	/**
	 * 编码函数
	 * @param string $p_strValue
	 * @param string $p_strOperation
	 * @param string $p_strKey
	 * @return string
	 */
	private static function _code($p_strValue,$p_strOperation,$p_strKey){
		$p_strKey=md5($p_strKey);
		$p_strKey_length=strlen($p_strKey);
		$p_strValue=$p_strOperation=='DECODE'?base64_decode($p_strValue):substr(md5($p_strValue.$p_strKey),0,8).$p_strValue;
		$p_strValue_length=strlen($p_strValue);
		
		$rndkey=$box=array();
		$result='';
		for($i=0;$i<=255;$i++){
			$rndkey[$i]=ord($p_strKey[$i%$p_strKey_length]);
			$box[$i]=$i;
		}
		
		for($j=$i=0;$i<256;$i++){
			$j=($j+$box[$i]+$rndkey[$i])%256;
			$tmp=$box[$i];
			$box[$i]=$box[$j];
			$box[$j]=$tmp;
		}
		
		for($a=$j=$i=0;$i<$p_strValue_length;$i++){
			$a=($a+1)%256;
			$j=($j+$box[$a])%256;
			$tmp=$box[$a];
			$box[$a]=$box[$j];
			$box[$j]=$tmp;
			$result.=chr(ord($p_strValue[$i])^($box[($box[$a]+$box[$j])%256]));
		}
		
		if($p_strOperation=='DECODE'){
			if(substr($result,0,8)==substr(md5(substr($result,8).$p_strKey),0,8)){
				return substr($result,8);
			}else{
				return '';
			}
		}else{
			return str_replace('=','',base64_encode($result));
		}
	}
}